const { spawn } = require('child_process');
const WebSocket = require('ws');
const http = require('http');
const fs = require('fs');
const path = require('path');

// 创建HTTP服务器提供网页
const server = http.createServer((req, res) => {
    if (req.url === '/') {
        res.writeHead(200, { 'Content-Type': 'text/html' });
        res.end(fs.readFileSync(path.join(__dirname, 'index.html')));
    }
});

// 启动WebSocket服务器
const wss = new WebSocket.Server({ server });

wss.on('connection', (ws) => {
    console.log('客户端已连接');
    
    // 检查scrcpy是否可用
        try {
            // Windows系统专用配置：使用标准输出(stdout)来捕获视频流
            // 使用--video-codec=h264参数确保scrcpy输出h264格式
            const scrcpy = spawn('scrcpy', ['--no-control', '--raw-stream', '-', '--video-codec=h264']);
            
            // 简化ffmpeg命令，使用更通用的参数配置
            const ffmpeg = spawn('ffmpeg', [
                '-i', 'pipe:0',
                '-c:v', 'copy',
                '-f', 'mp4',
                '-movflags', 'frag_keyframe+empty_moov+default_base_moof+faststart',
                'pipe:1'
            ]);
        
        // 记录scrcpy的输出和错误
        scrcpy.stdout.on('data', (data) => {
            console.log(`scrcpy stdout: ${data}`);
        });
        
        scrcpy.stderr.on('data', (data) => {
            console.error(`scrcpy stderr: ${data}`);
            // 发送错误信息到客户端
            if (ws.readyState === WebSocket.OPEN) {
                ws.send(JSON.stringify({ type: 'error', source: 'scrcpy', message: data.toString() }));
            }
        });
        
        scrcpy.on('close', (code) => {
            console.log(`scrcpy 进程已关闭，退出码 ${code}`);
        });
        
        // 记录ffmpeg的输出和错误
        ffmpeg.stdout.on('data', (data) => {
            if (ws.readyState === WebSocket.OPEN) {
                ws.send(data);
            }
        });
        
        ffmpeg.stderr.on('data', (data) => {
            console.error(`ffmpeg stderr: ${data}`);
            // 发送错误信息到客户端
            if (ws.readyState === WebSocket.OPEN) {
                ws.send(JSON.stringify({ type: 'error', source: 'ffmpeg', message: data.toString() }));
            }
        });
        
        ffmpeg.on('close', (code) => {
            console.log(`ffmpeg 进程已关闭，退出码 ${code}`);
        });
        
        // 管道连接：scrcpy -> ffmpeg
        scrcpy.stdout.pipe(ffmpeg.stdin);
        
        // 错误处理
        ws.on('error', (error) => {
            console.error(`WebSocket错误: ${error}`);
        });
        
        // 清理进程
        ws.on('close', () => {
            scrcpy.kill();
            ffmpeg.kill();
            console.log('客户端已断开');
        });
        
        console.log('执行完毕');
    } catch (error) {
        console.error(`启动进程时出错: ${error}`);
        if (ws.readyState === WebSocket.OPEN) {
            ws.send(JSON.stringify({ type: 'error', source: 'server', message: error.toString() }));
        }
    }
});

// 服务器错误处理
server.on('error', (error) => {
    console.error(`服务器错误: ${error}`);
});

// 启动服务器
server.listen(3001, () => {
    console.log('服务器运行在 http://localhost:3001');
    console.log('请确保：');
    console.log('1. 已安装scrcpy和ffmpeg并添加到系统环境变量');
    console.log('2. 安卓手机已连接并开启USB调试模式');
    console.log('3. 访问http://localhost:3001查看投屏页面');
});
